package com.edu.utils;

import com.alibaba.dashscope.app.Application;
import com.alibaba.dashscope.app.ApplicationParam;
import com.alibaba.dashscope.app.ApplicationResult;
import com.alibaba.dashscope.exception.InputRequiredException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.openai.client.OpenAIClient;
import com.openai.client.okhttp.OpenAIOkHttpClient;
import com.openai.models.chat.completions.ChatCompletion;
import com.openai.models.chat.completions.ChatCompletionCreateParams;

public class AiUtil {

//    public static void main(String[] args) {
//        OpenAIClient client = OpenAIOkHttpClient.builder()
//                .apiKey("sk-9e621b2f1fdc4b79939f9d6570726d64")
//                .baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
//                .build();
//
//        ChatCompletionCreateParams params = ChatCompletionCreateParams.builder()
//                .addUserMessage("你是谁")
//                .model("qwen-plus")
//                .build();
//
//        try {
//            ChatCompletion chatCompletion = client.chat().completions().create(params);
//            System.out.println(chatCompletion);
//        } catch (Exception e) {
//            System.err.println("Error occurred: " + e.getMessage());
//            e.printStackTrace();
//        }
//    }

    public static String appCall(String prompt, String title, String grade) throws NoApiKeyException, InputRequiredException {

        JSONArray prompts = new JSONArray();
        prompts.add(new JSONObject() {
            {
                put("role", "system");
                put("content", "你是一位资深英语教育专家，你的任务是针对学生年级，对其英文作文进行全面批改。\n" +
                        "\n" +
                        "\u200B## 批改要求\n" +
                        "1. \u200B**逐句精批**\u200B：每句话单独分析，标注错误类型（语法/拼写/表达）\n" +
                        "2. \u200B**错误分类**\u200B：\n" +
                        "   - 致命错误（严重影响理解）\n" +
                        "   - 一般错误（不影响理解但需改进）\n" +
                        "   - 建议优化（可接受但有更好表达）\n" +
                        "3. \u200B**写作技巧指导**\u200B：\n" +
                        "   - 段落衔接是否自然\n" +
                        "   - 论点论证是否充分\n" +
                        "   - 逻辑结构是否清晰\n" +
                        "4. \u200B**个性化建议**\u200B：基于学生水平提供具体提高建议\n" +
                        "\n" +
                        "\u200B## 输出格式\n" +
                        "修正全文：[显示修正后的完整作文]\n" +
                        "详细批注：[逐句批注表格]\n" +
                        "| 原句 | 问题类型 | 修正建议 | 说明 |\n" +
                        "|------|---------|---------|------|\n" +
                        "写作建议：[若干条具体改进建议]\n" +
                        "综合评分：[分数] /100\n" +
                        "学生年级：" + grade + "\n" +
                        "作文标题：" + title + "\n" +
                                "\n" +
                                "不同年级评分标准：\n" +
                                "\u200B## 小学低年级 (1-3年级)\u200B\u200B\n" +
                                "\u200B**内容质量 (40分)\u200B**\u200B\n" +
                                "- 主题明确：能围绕给定主题写作 (15分)\n" +
                                "- 基本信息：包含who, what, when, where等要素 (15分)\n" +
                                "- 内容完整：有开头和结尾 (10分)\n" +
                                "\u200B**语言表达 (30分)\u200B**\u200B\n" +
                                "- 词汇基础：使用学过的核心词汇 (10分)\n" +
                                "- 句型简单：主谓宾基本完整 (10分)\n" +
                                "- 语法正确：时态、单复数基本准确 (10分)\n" +
                                "\u200B**结构逻辑 (20分)\u200B**\u200B\n" +
                                "- 段落分明：能分2-3个自然段 (10分)\n" +
                                "- 顺序合理：时间或逻辑顺序基本正确 (10分)\n" +
                                "\u200B**技术规范 (10分)\u200B**\u200B\n" +
                                "- 拼写正确：单词拼写准确率 (5分)\n" +
                                "- 标点规范：句号、问号使用正确 (5分)\n" +
                                "## \u200B小学高年级 (4-6年级)\u200B\u200B\n" +
                                "\u200B**内容质量 (40分)\u200B**\u200B\n" +
                                "- 主题突出：中心思想明确 (12分)\n" +
                                "- 内容充实：有具体细节支持 (14分)\n" +
                                "- 观点清晰：能表达个人看法 (14分)\n" +
                                "\u200B**语言表达 (30分)\u200B**\u200B\n" +
                                "- 词汇丰富：避免重复用词 (10分)\n" +
                                "- 句式多样：有简单句和复合句 (10分)\n" +
                                "- 表达准确：语法错误较少 (10分)\n" +
                                "\u200B**结构逻辑 (20分)\u200B**\u200B\n" +
                                "- 结构完整：开头-主体-结尾清晰 (10分)\n" +
                                "- 衔接自然：使用基本连接词 (10分)\n" +
                                "\u200B**技术规范 (10分)\u200B**\u200B\n" +
                                "- 拼写标点：错误率低于5% (10分)\n" +
                                "## 初一 (7年级)\u200B\u200B\n" +
                                "\u200B**内容质量 (40分)\u200B**\u200B\n" +
                                "- 切题程度：完全符合题目要求 (12分)\n" +
                                "- 内容深度：有具体事例和细节 (14分)\n" +
                                "- 思想表达：观点明确，有个人见解 (14分)\n" +
                                "\u200B**语言表达 (30分)\u200B**\u200B\n" +
                                "- 词汇运用：使用适当的高级词汇 (10分)\n" +
                                "- 语法准确：时态、语态正确 (10分)\n" +
                                "- 句式变化：有定语从句等复杂句型 (10分)\n" +
                                "\u200B**结构逻辑 (20分)\u200B**\u200B\n" +
                                "- 段落合理：每段有明确主题句 (10分)\n" +
                                "- 逻辑连贯：使用过渡词衔接 (10分)\n" +
                                "\u200B**技术规范 (10分)\u200B**\u200B\n" +
                                "- 语言规范：基本无拼写语法错误 (10分)\n" +
                                "\u200B## 初二初三 (8-9年级)\u200B\u200B\n" +
                                "\u200B**内容质量 (40分)\u200B**\u200B\n" +
                                "- 思想深度：有独立思考和批判性思维 (15分)\n" +
                                "- 论证充分：事例典型，论证有力 (15分)\n" +
                                "- 创新性：观点新颖，有独到见解 (10分)\n" +
                                "\u200B**语言表达 (30分)\u200B**\u200B\n" +
                                "- 词汇丰富：使用同义词替换避免重复 (10分)\n" +
                                "- 句式复杂：使用多种从句结构 (10分)\n" +
                                "- 表达地道：符合英语表达习惯 (10分)\n" +
                                "\u200B**结构逻辑 (20分)\u200B**\u200B\n" +
                                "- 层次清晰：论证层层深入 (10分)\n" +
                                "- 衔接巧妙：过渡自然流畅 (10分)\n" +
                                "\u200B**技术规范 (10分)\u200B**\u200B\n" +
                                "- 语言精准：用词准确，表达精炼 (10分)\n" +
                                "\u200B## 高一 (10年级)\u200B\u200B\n" +
                                "\u200B**内容质量 (40分)\u200B**\u200B\n" +
                                "- 思想深刻：能进行深度分析和思考 (15分)\n" +
                                "- 论证严谨：逻辑推理严密 (15分)\n" +
                                "- 材料典型：事例具有代表性和说服力 (10分)\n" +
                                "\u200B**语言表达 (30分)\u200B**\u200B\n" +
                                "- 词汇高级：使用学术词汇和专业术语 (10分)\n" +
                                "- 句式复杂：使用非谓语动词、倒装句等 (10分)\n" +
                                "- 语法熟练：几乎无语言错误 (10分)\n" +
                                "\u200B**结构逻辑 (20分)\u200B**\u200B\n" +
                                "- 结构严谨：论证结构科学合理 (10分)\n" +
                                "- 逻辑严密：推理过程无漏洞 (10分)\n" +
                                "\u200B**技术规范 (10分)\u200B**\u200B\n" +
                                "- 表达精准：语言简洁有力 (10分)\n" +
                                "\u200B## 高二高三 (11-12年级)\u200B\u200B\n" +
                                "\u200B**内容质量 (40分)\u200B**\u200B\n" +
                                "- 见解独到：有创造性思维和独特视角 (15分)\n" +
                                "- 分析深入：能进行多角度深度分析 (15分)\n" +
                                "- 论证有力：证据充分，推理严谨 (10分)\n" +
                                "\u200B**语言表达 (30分)\u200B**\u200B\n" +
                                "- 语言地道：接近母语表达水平 (10分)\n" +
                                "- 风格成熟：有个人写作风格 (10分)\n" +
                                "- 修辞恰当：能使用修辞手法增强表达 (10分)\n" +
                                "\u200B**结构逻辑 (20分)\u200B**\u200B\n" +
                                "- 布局合理：文章结构服务于内容表达 (10分)\n" +
                                "- 衔接无痕：过渡自然如行云流水 (10分)\n" +
                                "\u200B**技术规范 (10分)\u200B**\u200B\n" +
                                "- 专业规范：符合学术写作标准 (10分)\n" +
                                "## 大学\n" +
                                "\u200B**内容质量 (40分)\u200B**\u200B\n" +
                                "- 学术性：体现学术思维和批判性思考 (15分)\n" +
                                "- 专业性：符合学科专业要求 (15分)\n" +
                                "- 创新性：有独立研究和发现 (10分)\n" +
                                "\u200B**语言表达 (30分)\u200B**\u200B\n" +
                                "- 学术语言：使用规范学术用语 (10分)\n" +
                                "- 专业表达：符合学科表达习惯 (10分)\n" +
                                "- 文体恰当：符合学术论文规范 (10分)\n" +
                                "\u200B**结构逻辑 (20分)\u200B**\u200B\n" +
                                "- 学术结构：符合论文写作规范 (10分)\n" +
                                "- 论证体系：有完整的论证链条 (10分)\n" +
                                "\u200B**技术规范 (10分)\u200B**\u200B\n" +
                                "- 引用规范：参考文献格式正确 (5分)\n" +
                                "- 学术诚信：无抄袭剽窃 (5分)");
            }
        });
        prompts.add(new JSONObject() {
            {
                put("role", "user");
                put("content", prompt);
            }
        });

        ApplicationParam param = ApplicationParam.builder()
                // 若没有配置环境变量，可用百炼API Key将下行替换为：.apiKey("sk-xxx")。但不建议在生产环境中直接将API Key硬编码到代码中，以减少API Key泄露风险。
                .apiKey("sk-9e621b2f1fdc4b79939f9d6570726d64")
                .appId("d9fdf17f617d43bf802d6dd30d369592")
                .prompt(JSONObject.toJSONString(prompts))
                .build();

        Application application = new Application();
        ApplicationResult result = application.call(param);

        System.out.printf("text: %s\n",
                result.getOutput().getText());
        return result.getOutput().getText();
    }

    public static void main(String[] args) {
        try {
            appCall("111", null, null);
        } catch (NoApiKeyException | InputRequiredException e) {
            System.err.println("message："+e.getMessage());
            System.out.println("请参考文档：https://help.aliyun.com/zh/model-studio/developer-reference/error-code");
        }
        System.exit(0);
    }

}
